import UIKit

/**
    B站：https://www.bilibili.com/video/BV144411C7Gg?p=17

    第17课 函数类型作为 函数的参数类型
 
    是上节课的延续
        
*/


func test() -> Void {
    print("test()函数，没有参数，没有返回值")
}

let b:() -> Void = {() -> Void in
    print("11")
}

func test1(param: () -> Void) -> Void {
    param()
}

test1(param: test)

// 调用 匿名函数 1
test1(param: {() -> Void in
    print("2222")
    print("212121")
})

// 调用 匿名函数 2
test1 { () -> Void in
    print("3333")
    print("444")
}

// 调用 匿名函数 3
test1 { () in
    print("555")
    print("66666")
}

// ------------------------------------

func sum(param:(Int,Int) -> Int) {
    let value = param(1, 2)
    print("value = \(value)")
}

// add 函数 - 有返回值
func add(a: Int, b: Int) -> Int {
    return a + b
}
sum(param: add)

// 调用匿名函数，有返回值
sum(param: {(a: Int, b: Int) -> Int in
    return a + b
})

// 也可以不用写 a、b 的类型，因为根据类型推断
sum(param: {(a, b) -> Int in
    return a + b
})

// -------------------------------------

// 数组匿名排序
var array = [1,3,5,0,2,8]
array.sort(by: {(a, b) -> Bool in
    if a < b {
        return true
    }
    return false
})

print("数组排序 正序 array= \(array)")

// 不采用匿名
func flashback(a: Int, b: Int) -> Bool {
    return a > b
}
array.sort(by: flashback)
print("数组排序 倒叙 array= \(array)")
